# coding: utf-8

import cv2
import numpy
import socket
import struct

# 建立套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器IP与端口
addr = ("192.168.100.102", 6000)

# 建立初始化连接
data = 'hello'
s.sendto(data.encode(), addr)

print('now waiting for frames...')
# 主循环
while True:
    # 接收数据，缓冲区大小（65536）
    data, addr = s.recvfrom(65535)
    # 如果服务器停止发送数据，则退出程序
    if len(data) == 1 and data[0] == 1:  # 如果收到关闭消息则停止程序
        s.close()
        cv2.destroyAllWindows()
        exit()
    # 校验数据设置（接收服务器发送的校验信息（数据长度））
    if len(data) != 4:  # 进行简单的校验，长度值是int类型，占四个字节
        length = 0
    else:
        length = struct.unpack('i', data)[0]  # 长度值
    # 继续接收数据主体
    data, address = s.recvfrom(65535)
    # 如果此次接收到的数据长度与校验长度不同，直接进入下次接收
    if length != len(data):
        continue
    data = numpy.array(bytearray(data))  # 格式转换
    imgdecode = cv2.imdecode(data, 1)  # 解码

    cv2.imshow('frames', imgdecode)  # 窗口显示
    if cv2.waitKey(1) == 27:  # 按下“ESC”退出
        break

# 关闭套接字
s.close()
cv2.destroyAllWindows()
